/**
 * 文件名称: serial.h
 * 摘    要: linux应用程序下操作serial头文件
 * 来    源: 自我总结
 *
 * 当前版本: 1.0 
 * 作    者: huenrong
 * 完成日期: 2019年05月15日
 **/


#ifndef __SERIAL_H
#define __SERIAL_H

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_SERIAL_NUM      4       // 系统最多支持的串口数
#define RECEIVE_BUF_LEN     256     // 串口接收线程接收buf长度

extern int g_serial_fd[MAX_SERIAL_NUM];     // 记录所有串口的文件描述符
extern int g_serial_receive_buf_len[MAX_SERIAL_NUM];     // 串口接收线程接收到的数据长度
extern char g_serial_receive_buf[MAX_SERIAL_NUM][RECEIVE_BUF_LEN];  // 串口接收线程接收到的数据

/************************************************************************
函数名称: open_serial
函数功能: 打开串口并设置属性
函数参数: port: 串口号
          speed: 波特率, 默认为115200
          databit: 数据位, 默认为8位数据位
          parity: 奇偶检验位, 默认为无校验'n'或'N'
          stopbit: 停止位, 默认为1位停止位
函数返回: 成功: 返回0
            失败: 返回-1
************************************************************************/
int open_serial(const int port, const int speed, const int databit, \
                const int parity, const int stopbit);

/************************************************************************
函数名称: close_serial
函数功能: 关闭串口
函数参数: port: 串口号
函数返回: 成功: 返回0
          失败: 返回-1
************************************************************************/
int close_serial(const int port);

/************************************************************************
函数名称：SerialSendData
函数功能：串口发送数据
函数参数：port: 串口号
          send_buf: 需要发送的数据
          send_buf_len: 需要发送的数据长度
函数返回：成功: 返回实际发送的数据长度
          失败: 返回-1
************************************************************************/
int serial_send_data(const int port, const char *send_buf, const int send_buf_len);

/************************************************************************
函数名称: serial_receive_data
函数功能: 从串口接收指定长度的数据
函数参数: port: 串口号
          receive_buf: 串口接收到的数据
          receive_buf_len: 指定接收数据长度
函数返回: 成功: 返回实际接收的数据长度
          失败: 返回-1
************************************************************************/
int serial_receive_data(const int port, char *receive_buf, const int receive_buf_len);

/************************************************************************
函数名称: serial_receive_onebyte
函数功能: 从串口接收1字节长度的数据
函数参数: port: 串口号
          receive_buf: 串口接收到的数据
          timeout: 超时时间(ms)
函数返回: 成功: 返回0
          失败: 返回-1
************************************************************************/
int serial_receive_onebyte(const int port, char *receive_buf, int timeout);

/************************************************************************
函数名称: serial_receive_pack
函数功能: 从串口接收数据包(带超时时间)
函数参数: port: 串口号
          receive_buf: 串口接收到的数据
          max_receive_len: 最大接收长度
          first_timeout: 第1个字节的超时时间
          timeout: 其余数据的间隔超时时间(ms)
函数返回: 成功: 返回实际接收数据长度
          失败: 返回-1
************************************************************************/
int serial_receive_pack(const int port, char *receive_buf, \
                        const int max_receive_len, int first_timeout, int timeout);

/************************************************************************
函数名称: creat_serial_receive_thread
函数功能: 创建串口接收线程(类似于单片机的串口中断)
函数参数: port: 串口号
函数返回: 成功: 返回0
          失败: 返回-1
************************************************************************/
int creat_serial_receive_thread(const int port);


#ifdef __cplusplus
}
#endif

#endif /* __SERIAL_H */

